package com.safeneeds.util.other;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.safeneeds.util.log.ALogFactory;

/**
 * 文件操作类
 * 
 * @version 1.0
 * @date 2015-10-30
 * @author gaof
 */
public class FileUtil {

	/**
	 * 文件的上传
	 * 
	 * @param file
	 *            ： 文件
	 * @param path
	 *            ：储存位置的路径
	 * @param filesName
	 *            ：文件的名字
	 * @return
	 */
	public static File uploadTo(File file, String path, String fileName)
			throws IOException {

		File destFile = new File(path, fileName);//输出文件,fileFileName由struts2自动注入
		InputStream is = new FileInputStream(file);// 构造输入字节流

		if (destFile.exists()) {
			ALogFactory.getLog().info("文件已存在！");
			throw new IOException();
		} else {
			int length = 0;
			byte[] buffer = new byte[1024];
			OutputStream os = new FileOutputStream(destFile);
			
			try {
				while (0 < (length = is.read(buffer))) {
					os.write(buffer, 0, length);
				}
			} catch (IOException e) {
				ALogFactory.getLog().warn("文件上传时文件流出错", e);
			} finally {
				if (null != os) {
					os.close();
				}
				if (null != is) {
					is.close();
				}
			}

			return destFile;

		}
	}
	
	/**
	 * 文件的上传,重名文件覆盖
	 * 
	 * @param file
	 *            ： 文件
	 * @param path
	 *            ：储存位置的路径
	 * @param filesName
	 *            ：文件的名字
	 * @return
	 */
	public static File uploadToCover(File file, String path, String fileName)
			throws IOException {

		File destFile = new File(path, fileName);// 输出文件,fileFileName由struts2自动注入
		InputStream is = new FileInputStream(file);// 构造输入字节流

		// 删除同名文件
		if (destFile.exists()) {
			destFile.delete();
		}
		
		int length = 0;
		byte[] buffer = new byte[1024];
		OutputStream os = new FileOutputStream(destFile);

		try {
			while (0 < (length = is.read(buffer))) {
				os.write(buffer, 0, length);
			}
		} catch (IOException e) {
			ALogFactory.getLog().warn("文件上传时文件流出错", e);
		} finally {
			if (null != os) {
				os.close();
			}
			if (null != is) {
				is.close();
			}
		}

		return destFile;
	}
	
	
	/**
	 * 删除文件
	 * @param filePath
	 */
	public static void delFile(String filePath){
		
		if (filePath == null || "".equals(filePath.trim())) {
			return;
		}
		
		File file = new File(filePath);
		if (file.exists()) {
			file.delete();
		}
	}
	
	/**
	 * 获取文件类型
	 * @return
	 */
	public static String getFileType(File file){
		String fileName = file.getName();
		if (fileName.indexOf(".") != -1) {
			return fileName.substring(fileName.lastIndexOf(".") + 1);
		}
		
		return "";
	}
	
	/**
	 * 获取文件类型
	 * @return
	 */
	public static String getFileType(String fileName){
		if (fileName.indexOf(".") != -1) {
			return fileName.substring(fileName.lastIndexOf(".") + 1);
		}
		
		return "";
	}
	
	/**
	 * 获取文件类型
	 * @return
	 */
	public static String getFileTypeLower(String fileName){
		if (fileName.indexOf(".") != -1) {
			return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
		}
		
		return "";
	}

	/**
	 * 删除文件夹
	 * @param filePath
	 */
	public static void delFileDir(String filePath) {
		File dir = new File(filePath);
		if (dir == null || !dir.exists() || !dir.isDirectory())
			return;

		for (File file : dir.listFiles()) {
			if (file.isFile())
				file.delete(); // 删除所有文件
			else if (file.isDirectory())
				delFileDir(file.getPath()); // 递规的方式删除文件夹
		}
		dir.delete();// 删除目录本身
	}
	
	
	public static void upFile(InputStream is,String fileName,String filePath){

		FileOutputStream fos = null;

		BufferedOutputStream bos = null;

		BufferedInputStream bis = null;

		File file = new File(filePath);

		if(!file.exists()){

			file.mkdirs();

		}

		File f = new File(filePath+"/"+fileName);

		try {

			bis = new BufferedInputStream(is);

			fos = new FileOutputStream(f);

			bos = new BufferedOutputStream(fos);

			byte[] bt = new byte[4096];

			int len;

			while((len = bis.read(bt))>0){

				bos.write(bt, 0, len);

			}

		} catch (Exception e) {

		e.printStackTrace();

		}
			finally {
		
				try {
		
					if(null != bos){
		
						bos.close();
		
						bos = null;
					}
		
					if(null != fos){
		
						fos.close();
			
						fos= null;
					}
		
					if(null != is){
			
						is.close();
			
						is=null;
					}
		
					if (null != bis) {
			
						bis.close();
			
						bis = null;
					}
		
				} catch (Exception e) {
		
					e.printStackTrace();
		
				}
		
			}

		}
	
}
